﻿#ifndef CLASSFORHOSTDISCOVER_H
#define CLASSFORHOSTDISCOVER_H

#include <appbase.h>
#include <classfordnsiniform.h>

#include <QWidget>
#include <QTabWidget>
#include <QTcpSocket>
#include <QProcess>
#include <QDir>
#include <QFile>
#include <QTextStream>
#include <QDateTime>

namespace Ui {
class ClassForHostDiscover;
}

class ClassForHostDiscover : public QWidget
{
    Q_OBJECT

public:
    explicit ClassForHostDiscover(QWidget *parent = nullptr);
    ~ClassForHostDiscover();

signals:
    //void clicked();
    void readyReadStandardOutput();
    /*
     * 向 DNS 编辑界面发送数据，以便于编辑DNS列表
     * */
    void signalOfSend2DnsForm(QStringList &comList);

private:

    /*
     * 存储当前标签页的位置
     * */
    QString varCurrentTab = "0";

    /*
     * 程序的基础配置, 目的是为了写配置文件
     * */
    AppBase* pAppBase = nullptr;

    /*
     * 标签对象,用于记录标签状态
     * */
    QTabWidget* pObjQTabWidOfHostDis = nullptr;

    /*
     * 用于打开运行日志文件的目录
     * Explorer 命令
     * */
    QProcess* pObjOprOfExplorer = nullptr;

    /*
     * 第一标签页 QProcess 外部程序调用对象
     * ping命令
     * */
    QProcess* pObjOprOfPing = nullptr;

    /*
     * 第一标签页 QProcess 外部程序调用对象
     * ARP 命令
     * */
    QProcess* pObjOprOfArp = nullptr;

    /*
     * 第二标签页 QProcess 外部程序调用对象
     * Tracert 路由追踪命令
     * */
    QProcess* pObjOprOfTracert = nullptr;

    /*
     * 第三标签页 QProcess 外部程序调用对象
     * TCP 探测调用对象，调用tcping命令
     * */
    QProcess* pObjQprOfTcpPort = nullptr;

    /*
     * 第四标签页 QProcess 外部程序调用对象
     * nslookup 域名解析命令
     * */
    QProcess* pObjQprOfNslookup = nullptr;

    /*
     * 用来显示 DNS 编辑窗口
     * */
    ClassForDnsIniForm* pFormOfDnsIni = nullptr;

    /*
     * 保存获取 DNS INI 配置文件 vlaue 部分到 QStringList
     * */
    QStringList varQStrListOfSendDnsData = {};



private slots:

    /*
     * 标签页单击事件
     * */
    //void funSlotsOfTabBarClicked();

    /*
     * 点击 清空 按钮 事件
     * */
    void funSlotsOftxtEdClear();

    /*
     * 点击 "恢复默认值" 按钮 事件
     * */
    void funSlotsOfControlInitializeOfThird();

    /*
     * 第一标签页 ping/stop 按钮点击事件
     * */
    void funSlotsOfIcmpPing();

    /*
     * 第一标签页 ARP 按钮点击事件
     * */
    void funSlotsOfArpClick();

    /*
     * 第一标签 ping信息回显函数
     * */
    void funSlotsOfPingMessage();

    /*
     * 第一标签 arp信息回显函数
     * */
    void funSlotsOfArpMessage();

    /*
     * 第二标签页 获取本地IPv6地址列表函数
     * */
    void funSlotsOfGetLocalIPv6OfSecond();

    /*
     * 第二标签页 追踪 按钮的点击事件
     * */
    void funSlotOfTracertOfSecond();

    /*
     * 第二标签 信息回显函数
     * */
    void funVoidTracertMessage();

    /*
     * 第三标签 TCP探测 按钮事件
     * */
    void funVoidTcpCmdArguments();

    /*
     * 第三标签页 获取本地IP地址列表函数
     * */
    void funSlotsOfGetLocalIPOfThird();

    /*
     * 第三标签 信息回显函数
     * */
    void funVoidTcpPortMessage();

    /*
     * 第四标签页 解析按钮点击事件
     * */
    void funSlotsOfNslookup();

    /*
     * 第四标签页 信息回显函数
     * */
    void funVoidNslookupMessage();

    /*
     * 第四标签页 获取 DNS INI 中的配置
     * */
    void funVoidReadDnsIni();

    /*
     * 第四标签页 获取DNS地址 赋值给 comboBox 控件
     * */
    void funVoidAddItemToCombo();

    /*
     * 第四标签页 打开 DNS 列表编辑窗口
     * */
    void funSlotsOfOpenDnsEditForm();

    /*
     * 第四标签页 接收和处理子窗口传回的数据
     * */
    void funSlotsOfProcessingDataForSub(QStringList &comList);



private: // 声明函数
    Ui::ClassForHostDiscover *ui;

    /*
     * 控件“样式”初始化函数
     * */
    void funVoidControlInitialize() const;

    /*
     * 执行结果写入日志
     * @LogOfType 用来标识谁写的文件
     * @RunLog 为要写入的内容
     * */
    void funVoidRunLogOfWrite(QString &LogOfType, QString &RunLog);

};


#endif // CLASSFORHOSTDISCOVER_H
